perm filename XREFS.SAI[PUB,TES] blob sn#129314 filedate 1974-11-03 generic text, type T, neo UTF8
00100	BEGOF("XREFS")
00200	
00300	COMMENT
00400	
00500	                *** Variations at Different Sites ***
00600	
00700	TENEX PUB has a different naming scheme for intermediate files.
00800	
00900	                                 ***

01000	
01100	Labels and cross-references.  Page labels are the trickiest because
01200	they are always forward references, but they are resolved as soon as
01300	the page is written out.
01400	
01500	;
01600	
01700	PROCEDURES
     

00100	PUBLIC SIMPLE PROCEDURE XREFS! ;$"#
00200	BEGIN "XREFS!"
00300	PLBL ← BRKPLBL ← -TWO(13) ;
00400	END "XREFS!" ;
     

00100	PUBLIC SIMPLE PROCEDURE FINIXREFS ;$"#
00200	BEGIN "FINIXREFS"
00300	COMMENT Write out Labels for Pass Two ;
00400	L ← WRITEON(FALSE, IFC TENEX THENC IFILENAME&".LABELS" ELSEC "PULABL"&PUIEXT ENDC) ;
00500	OUT(L, CVSR(XSYMNO MAX IHIGH) ) ;
00600	FOR J ← 1 THRU XSYMNO DO
00700	    IF (BYTEWD ← NUMBER[J]) NEQ 0  AND (K← LDB(SYMBOLWD(BYTEWD))) = 0 OR K='17777 THEN
00800		IF LDB(PLIGHTWD(BYTEWD)) = 2 THEN OUT(L, CVSR(0) & CVSR(J) & STBL[LDB(IXWD(BYTEWD))]&ALTMODE )
00900		ELSE WARN("=","Undefined Label "&SYM[J]) ;
01000	FOR J ← 1 THRU IHIGH DO IF LH(BYTEWD ← ITBL[J]) = '400000 THEN
01100		OUT(L, CVSR(1) & CVSR(J) & STBL[LDB(IXWD(BYTEWD))] & ALTMODE) ;
01200	RELEASE(L) ;
01300	END "FINIXREFS" ;
     

00100	PUBLIC BOOLEAN SIMPLE PROCEDURE LABELDEF ;$"#
00200	IF  NOT NEXTSCH(:) THEN RETURN(FALSE)
00300	ELSE IF  NOT ON THEN
00400		BEGIN
00500		WHILE THISISID AND NEXTSCH(:) DO BEGIN PASS ; PASS END ;
00600		IF NOT NEXTSTATEMENT THEN E(0, 0) ;  RETURN(TRUE) ;
00700		END
00800	ELSE
00900	BEGIN
01000	INTEGER LINK, PTR, PLIGHT, USYMB, WASSYMB, VALPTR ; STRING DEFVAL ;
01100	SIMPLE PROCEDURE CHECK!CONSISTENCY ;
01200		IF WASSYMB AND USYMB NEQ 0 AND LDB(IXN(WASSYMB)) NEQ LDB(IXN(ABS(USYMB))) THEN
01300			WARN("=",<"Label "&SYM[LINK]&" was cross-referenced as a "&
01400				SYM[WASSYMB]&" but is being defined as a "&
01500				SYM[ABS(USYMB)]>) ;
01600	LINK ← 0 ; 
01700	DO	BEGIN "MULTIPLE LABELS"
01800		PTR ← SYMNUM(THISWD&":") ;  BYTEWD ← NUMBER[PTR] ;
01900		IF BYTEWD=0 OR ( PLIGHT ← LDB(PLIGHTWD(BYTEWD)) ) = 1 THEN
02000			BEGIN NUMBER[PTR] ← BYTEWD LSH 13 LOR LINK ;  LINK ← PTR END
02100		ELSE WARN("=",<"Label "&SYM[PTR]&" is already defined as "&
02200			(IF PLIGHT=2 THEN STBL[IX] ELSE "a recent page number")>) ;
02300		PASS ; PASS ;
02400		END "MULTIPLE LABELS"
02500	UNTIL  NOT (THISISID AND NEXTSCH(:)) ;
02600	IF LINK = 0 THEN RETURN(TRUE) ; TES 11/29/73 ;
02700	DEFVAL ← IF (USYMB←NEXTSTATEMENT)=0 THEN E(0,0)
02800		 ELSE IF USYMB>TWO(13) THEN "??"
02900		 ELSE IF USYMB>0 THEN C! ELSE !;
03000	IF EQU(DEFVAL,0) OR USYMB = SYMPAGE THEN
03100	DO	BEGIN "PAGE LABELS"
03200		NUMBER[LINK] SWAP PLBL ;  WASSYMB ← PLBL LSH -13 ;
03300		CHECK!CONSISTENCY ;
03400		PLBL SWAP LINK ;  LINK ← LINK LAND '17777 ;  PLBL ← -PLBL ;
03500		END "PAGE LABELS"
03600	UNTIL LINK=0
03700	ELSE	BEGIN "OTHER COUNTER"
03750		IF XCRIBL THEN COMPMAXIMS ; TES 11/2/74 SO XLENGTH WON'T COMPLAIN ;
03800		VALPTR ← 2 ROT -2 LOR PUTS(DEFVAL&(IF XCRIBL THEN ALTMODE&CVS(XLENGTH(DEFVAL)) ELSE NULL)) ;
03900		DO	BEGIN
04000			PTR ← VALPTR ;  NUMBER[LINK] SWAP PTR ;  WASSYMB ← PTR LSH -13 ;
04100			CHECK!CONSISTENCY ;
04200			LINK ← PTR LAND '17777 ;
04300			END
04400		UNTIL LINK=0 ;
04500		END "OTHER COUNTER" ;
04600	RETURN(TRUE) ;
04700	END "LABELDEF" ;
     

00100	PUBLIC STRING SIMPLE PROCEDURE LABELREF(INTEGER USYMB, LEN) ;$"#
00200	IF  NOT ON THEN RETURN(NULL) ELSE
00300	BEGIN "LABELREF"
00400	INTEGER PTR, PLIGHT, WASSYMB ; STRING S ;
00500	IF NULSTR(THISWD) THEN COMMENT, Generated Label for {PAGE}. USYMB=0.;
00600		PTR ← (PLBL ← PUTI(1, PLBL)) LOR TWO(14)   COMMENT Add to Linked List ;
00700	ELSE IF BYTEWD ← NUMBER[ PTR ← SYMNUM(THISWD & ":") ] THEN
00800		BEGIN "KNOWN LABEL"
00900		CASE (PLIGHT ← LDB(PLIGHTWD(BYTEWD))) MOD 3 OF
01000			BEGIN COMMENT BY PLIGHT ;
01100			COMMENT 0 or 3 ... Page Label still Uncertain ; WASSYMB ← SYMPAGE ;
01200			COMMENT 1 ... Referenced but not defined ; WASSYMB ← LDB(IXWD(BYTEWD)) ;
01300			COMMENT 2 ... Defined and Certain ;
01400				BEGIN
01500				BREAKSET(LOCAL!TABLE,ALTMODE,"IS");
01600				BREAKSET(LOCAL!TABLE,NULL,"O");
01700				S ← STBL[LDB(IXWD(BYTEWD))] ;
01800				RETURN (SCAN(S,LOCAL!TABLE,DUMMY));
01900				END;
02000			END ; COMMENT BY PLIGHT ;
02100		IF USYMB AND LDB(IXN(USYMB)) NEQ LDB(IXN(WASSYMB)) THEN
02200			BEGIN "DIFFERENT COUNTER"
02300			IF WASSYMB THEN WARN("X-REF ERROR",<"Label "&SYM[PTR]&
02400				" was cross-referenced as a "&SYM[WASSYMB]&
02500				" earlier, but now as a "&SYM[USYMB]>) ;
02600			IF PLIGHT = 1 THEN NUMBER[PTR] ← 1 ROT -2 LOR USYMB ;
02700			END "DIFFERENT COUNTER" ;
02800		END "KNOWN LABEL"
02900	ELSE NUMBER[PTR] ← 1 ROT -2 LOR USYMB ;
03000	RETURN(RUBOUT & CVS(LEN) & VT & CVS(PTR) & VT) ;
03100	END "LABELREF" ;
     

00100	FINISHED
00200	
00300	ENDOF("XREFS")